package org.zjt.chapter1.channel.handler;

import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.util.ReferenceCountUtil;

/**
 * Description:
 *
 *
 * 1、channel 事件 ：
 *
 *
 *      channelRegistered  ->  channelActive  -> channelRead  -> channelReadComplete -> channelInactive ->  channelUnregistered
 *
 *
 * 2、释放资源ByteBuf：
 *
 *      ReferenceCountUtil.release(msg);
 *
 *
 * 3、fireEvent：
 *
 *      通知下一个handler 处理对象事件。例如： 调用 ctx.fireChannelRead(msg);，通知下一个handler channelRead 执行。super.channelRead 已经实现。
 *
 *
 * @author juntao.zhang
 * Date: 2018-07-11 下午6:59
 * @see
 */
public class MyChannelInboundHandler extends ChannelInboundHandlerAdapter {


    /**
     * socket channel 注册事件
     *
     * @param ctx
     * @throws Exception
     */
    @Override
    public void channelRegistered(ChannelHandlerContext ctx) throws Exception {
        super.channelRegistered(ctx);
    }

    /**
     * socket channel 取消注册事件
     * @param ctx
     * @throws Exception
     */
    @Override
    public void channelUnregistered(ChannelHandlerContext ctx) throws Exception {
        super.channelUnregistered(ctx);
    }

    /**
     * socket channel 激活事件
     *
     * @param ctx
     * @throws Exception
     */
    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        super.channelActive(ctx);
    }

    /**
     * socket channel 注销事件
     *
     * @param ctx
     * @throws Exception
     */
    @Override
    public void channelInactive(ChannelHandlerContext ctx) throws Exception {
        super.channelInactive(ctx);
    }

    /**
     * channel 接受到事件
     * @param ctx
     * @param msg
     * @throws Exception
     */
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        super.channelRead(ctx, msg);

        // 调用 ctx.fireChannelRead(msg);，通知下一个handler channelRead 执行。super.channelRead 已经实现。

        //释放接受到的ByteBuf
        ReferenceCountUtil.release(msg);
    }

    /**
     * channel 事件接受完成
     * @param ctx
     * @throws Exception
     */
    @Override
    public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
        super.channelReadComplete(ctx);
    }

    /**
     *  当ChannelnboundHandler.fireUserEventTriggered() 方法被调用时被调用
     *
     * @param ctx
     * @param evt
     * @throws Exception
     */
    @Override
    public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
        super.userEventTriggered(ctx, evt);
    }

    /**
     * 可写状态： channel 当Channel 的可写状态发生改变时被调用。
     * @param ctx
     * @throws Exception
     */
    @Override
    public void channelWritabilityChanged(ChannelHandlerContext ctx) throws Exception {
        super.channelWritabilityChanged(ctx);
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        super.exceptionCaught(ctx, cause);
    }

    @Override
    protected void ensureNotSharable() {
        super.ensureNotSharable();
    }

    @Override
    public boolean isSharable() {
        return super.isSharable();
    }

    /**
     * handler 添加
     * @param ctx
     * @throws Exception
     */
    @Override
    public void handlerAdded(ChannelHandlerContext ctx) throws Exception {
        super.handlerAdded(ctx);
    }

    /**
     * handler 被移除
     * @param ctx
     * @throws Exception
     */
    @Override
    public void handlerRemoved(ChannelHandlerContext ctx) throws Exception {
        super.handlerRemoved(ctx);
    }
}
